15.1 Introduction to ORM with Spring 介绍 Spring 中的 ORM

Spring Framework 支持集成 Hibernate, Java Persistence API (JPA) 和 Java Data Objects (JDO) 用于资源管理、数据访问对象(DAO)的实现,和事务策略。例如,对于 Hibernate 有一流的支持,使用方便的 IoC 特性,解决许多典型的 Hibernate 集成问题。您可以通过依赖注入配置的所有 O/R (对象关系) 映射工具的特性。他们可以参与 Spring 的资源和事务管理,他们符合 Spring 的通用事务和 DAO 异常层次结构。建议集成风格是在 Hibernate, JPA, 和 JDO APIs 中使用 DAO 。旧的 Spring DAO 模板不再推荐使用;然而,关于风格的论述可以见32.1节,“经典的 ORM 使用”

当你创建数据访问应用时,Spring 能对你选择的 ORM 层进行显着的增强。你根据你的需求进行尽可能多的集成支持,同时需要比这种整合在建一个类似的基础设施时的内部风险。通过库,你可以使用很多的 ORM 的支持,不用管技术,因为一切都是设计成一组可重用的 JavaBean。ORM 在 Spring IoC 容器便于配置和部署。因此,本文中的大多数示例配置显示在 Spring 容器里。

使用 Spring Framework 来创建您的 ORM DAO 好处包括:

  • 更容易测试。Spring 的 IoC 方法便于交换实现和配置 Hibernate SessionFactory 实例,JDBC DataSource(数据源)实例,事务管理,以及映射对象实现(如果需要)。这反过来使其更容易隔离测试每一块持续相关代码。
  • 常见的数据访问异常。Spring 可以从你的 ORM 工具包装异常,将他们从专有的(可能检查)异常转为共同运行时 DataAccessException 层次。这个特性允许您处理大多数持久化的异常不可恢复的,而且只出现在适当的层,没有恼人的捕捉、抛出、和异常声明。当然根据需要你仍然可以捕获和处理异常。记住,JDBC 异常(包括数据库特殊的方言)也转换为相同的层次结构,这意味着您可以在使用 JDBC 执行一些操作时拥有一致的编程模型。
  • 通用资源管理。Spring 应用程序上下文可以处理的定位和配置Hibernate SessionFactory 实例,JPA EntityManagerFactory实例,JDBC DataSource(数据源)实例,和其他相关资源。这使得这些值易于管理和改变。Spring 提供了高效、简单和安全处理持久性的资源。例如,关联代码来使用 Hibernate ,通常需要使用相同的 Hibernate Session,以确保高效和适当的事务处理。Spring 很容易创建和透明地将Session绑定到当前线程,通过使用 Hibernate SessionFactory 来暴露出当前Session。因此,针对任何本地或 JTA 事务环境,Spring 解决许多在典型的 Hibernate 使用中的惯性问题。
  • 集成事务管理。可以通过声明式的,面向方面的编程(AOP)风格方法拦截器包装你的 ORM 代码通过吗,可以采用@Transactional注释或通过显式配置事务 AOP advice 在一个 XML 配置文件中。在这两种情况下,都是可以为您处理事务语义和异常处理(回滚,等等)。如下面所讨论的资源和事务管理,你也可以交换不同的事务管理器,而不影响 ORM 相关的代码。例如,您可以在相同的全面服务(如声明性事务)的两个场景,实现本地事务和 JTA 之间交换。另外,JDBC 相关的代码可以完全集成事务到你使用的 ORM 代码中。这是对于数据访问有用,但不适合 ORM 中的批处理和 BLOB 流等,这仍然需要在ORM操作 交换共同的事务。

为更全面了解的 ORM 的支持,包括支持替代数据库技术,如 MongoDB 数据库,您可能希望查看 Spring Data 配套的项目。如果你是一个 JPA 用户,Getting Started Accessing Data with JPA提供了一个很好的介绍。